#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>


//IDA*
using namespace std;
const int N = 24;

int op[8][7] = {
    {0, 2, 6, 11, 15, 20, 22},
    {1, 3, 8, 12, 17, 21, 23},
    {10, 9, 8, 7, 6, 5, 4},
    {19, 18, 17, 16, 15, 14, 13},
    {23, 21, 17, 12, 8, 3, 1},
    {22, 20, 15, 11, 6, 2, 0},
    {13, 14, 15, 16, 17, 18, 19},
    {4, 5, 6, 7, 8, 9, 10}
};

int opposite[8] = {5, 4, 7, 6, 1, 0, 3, 2};
int center[8] = {6, 7, 8, 11, 12, 15, 16, 17};

int q[N];
int path[100];

int f(){
    int sum[4] = {0};
    
    for (int i = 0; i < 8; i ++){
        sum[q[center[i]]]++;
    }

    int s = 0;
    for (int i = 1; i <= 3; i ++){
        s = max(s, sum[i]);
    }

    return 8 - s;
}

void opporate(int k){
    int x = q[op[k][0]];
    for (int i = 0; i + 1 < 7; i ++){
        q[op[k][i]] = q[op[k][i + 1]];
    }

    q[op[k][6]] = x;
}


bool dfs(int u, int last_operate, int max_depth){
    if(u + f() > max_depth){
        return false;
    }

    if(f() == 0){
        return true;
    }

    for (int i = 0; i < 8; i ++){
        if(opposite[i] != last_operate){
            opporate(i);
            path[u] = i;
            if(dfs(u + 1, i, max_depth)){
                return true;
            }
            opporate(opposite[i]);
        }
    }

    return false;
}


int main()
{
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
    while(cin >> q[0], q[0]){
        
        for (int i = 1; i < N; i ++){
            cin >> q[i];
        }

        int depth = 0;
        while(!dfs(0, -1, depth)){
            depth++;
        }


        if(depth == 0){
            cout << "No moves needed" << endl;
            cout << q[6] << endl;
        }else{
            for (int i = 0; i < depth; i ++){
                cout << (char)(path[i] + 'A');
            }
            cout << endl;
            cout << q[6] << endl;
        }
    }
    return 0;
}